-- KEYS[1]: redpacket:{id}:stock      - 库存Key
-- KEYS[2]: redpacket:{id}:amount_list - 金额列表Key
-- KEYS[3]: redpacket:{id}:grabed_users - 已抢用户记录Key
-- KEYS[4]: userId                    - 用户ID

-- 1. 参数验证
if #KEYS < 4 then
    return 'ERROR_PARAMS'  -- 参数不足
end

-- 2. 检查红包是否存在（检查多个关键key）
if redis.call('exists', KEYS[1]) == 0 or redis.call('exists', KEYS[2]) == 0 then
    return 'RED_PACKET_NOT_EXISTS'  -- 红包不存在
end

-- 3. 检查用户是否已抢过该红包
if redis.call('hexists', KEYS[3], KEYS[4]) == 1 then
    return 'USER_ALREADY_GRABED'  -- 用户已抢过
end

-- 4. 检查库存（更安全的类型转换）
local stock = redis.call('get', KEYS[1])
if not stock then
    return 'STOCK_ERROR'  -- 库存数据异常
end

stock = tonumber(stock)
if not stock or stock <= 0 then
    return 'STOCK_EMPTY'  -- 库存不足
end

-- 5. 从金额列表中弹出一个金额
local amount = redis.call('lpop', KEYS[2])
if not amount then
    return 'AMOUNT_LIST_EMPTY'  -- 金额列表为空
end

-- 6. 库存减一（确保操作成功）
redis.call('decr', KEYS[1])

-- 7. 标记用户已抢
redis.call('hset', KEYS[3], KEYS[4], amount)

-- 8. 设置过期时间（只在第一次设置）
if redis.call('ttl', KEYS[3]) == -1 then  -- 如果没有设置过期时间
    redis.call('expire', KEYS[3], 86400)  -- 24小时过期
end

return amount  -- 返回抢到的金额